package cn.wen.eeayjoke.app;

import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;

import com.squareup.leakcanary.LeakCanary;
import com.taobao.sophix.PatchStatus;
import com.taobao.sophix.SophixManager;
import com.taobao.sophix.listener.PatchLoadStatusListener;
import com.tencent.bugly.crashreport.CrashReport;
import com.wen.web.WebManager;

/**
 * 初始化Util类
 */

public class InitUtil {
    private static volatile InitUtil instance;
    /**
     * 是否已经初始化
     */
    private static boolean isInit = false;

    public static InitUtil getInstance() {
        if (instance == null) {
            synchronized (InitUtil.class) {
                if (instance == null) {
                    instance = new InitUtil();
                }
            }
        }
        return instance;
    }

    /**
     * 初始化
     */
    public void init(Application context) {
        if (context == null || isInit) {
            return;
        }
        isInit = true;
        // 阿里百川--热修复
        initFix(context);
        // Bugly SDK初始化 地址：https://bugly.qq.com/v2/workbench/apps
        CrashReport.initCrashReport(context);
        // 内存泄漏检测工具
        if (LeakCanary.isInAnalyzerProcess(context)) {
            return;
        }
        LeakCanary.install(context);
        // 内存泄漏检测工具
    }

    /**
     * 初始化其它
     */
    public void initOther(Context context) {
        WebManager.getInstance().init(context);
    }

    // 阿里百川
    private static void initFix(Application context) {
        // 阿里百川
        // 后台地址：https://hotfix.console.aliyun.com/#/list
        // initialize最好放在attachBaseContext最前面，初始化直接在Application类里面，切勿封装到其他类
        SophixManager.getInstance()
                .setContext(context)
                .setAppVersion(getVersionName(context))
                .setAesKey(null)
                .setEnableDebug(false)
                .setPatchLoadStatusStub(new PatchLoadStatusListener() {
                    @Override
                    public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
                        // 补丁加载回调通知
                        if (code == PatchStatus.CODE_LOAD_SUCCESS) {
                            // 表明补丁加载成功
                        } else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
                            // 表明新补丁生效需要重启. 开发者可提示用户或者强制重启;
                            // 建议: 用户可以监听进入后台事件, 然后调用killProcessSafely自杀，以此加快应用补丁，详见1.3.2.3
                        } else {
                            // 其它错误信息, 查看PatchStatus类说明
                            SophixManager.getInstance().cleanPatches();
                        }
                    }
                }).initialize();
        // 阿里百川-->>此方法会产生费用。
        //SophixManager.getInstance().queryAndLoadNewPatch();
    }

    /**
     * 获取应用程序版本名称信息
     */
    private static String getVersionName(Context context) {
        try {
            PackageManager packageManager = context.getPackageManager();
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    context.getPackageName(), 0);
            return packageInfo.versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
